花了將近一個月的時間在k8s上建置各種服務,雖然大部分都是無狀態的服務可以隨時重建也不影響運行,不過大部分公司還是會希望進行備份,所以在k8s上通常會做到底層的備份、etcd備份,這兩種備份是對整個集群狀態的備份,如果要細分到pod、namespace就沒有辦法,因此今天會介紹一套k8s的備份/還原/升級工具velero。
velero是一套k8s的備份還原工具,透過crd的方式將k8s上的資源進行備份和還原作業,安裝velero之後將會有以下crd
透過crd可以觀察到,velero會將備份和還原都視為一種resource,根據resource的定義備份哪些namespace或是pod,同時將備份的資料存到定義的storage(例如s3、minio),所以如果想要還原,就也要在cluster上安裝velero並且連到有備份檔案的storage讓velero能夠restore;而velero 與重新透過yaml或是gitops的方式佈署服務來還原其中最大的差異在於restic這個參數,當啟用了restic的備份,就可以將pod的實際volume也備份起來(不包含hostpath),想要觀察restic的話,會發現有啟用restic的話會有一個restic的daemonset在每個node上運行唷,所以可以知道當velero收到備份的resource時,會像下圖一樣的流程由一個backup controller把相關的資訊備份上傳。
而velero的用處也不僅止於backup / restore,其實他最初的用意是當有升級或是移轉的需求時可以用velero將resources轉移到新的cluster,所以velero也能夠支援異平臺的轉移,像是地端k8s轉移到gke、eks上,openshift轉移到gke上,有些會需要用額外的工具達成,而vmware在收購了velero後也有推出許多相關的工具,有興趣的人也可以研讀TMC相關的文件。
但是回歸源頭,還是希望各位反思,自己是否真的有backup的需求,如果服務都是無狀態的並且透過gitops或是有將yaml進行保存,那麼當k8s有發生異常/損毀時,重新佈署跟透過velero還原或是etcd還原,到底有沒有需要用到velero呢?